package jp.co.ikd.swing.compornent;

import javax.swing.JTextField;
import javax.swing.text.Document;

/**
 * 徴税用テキストフィールド
 * <p>
 * <li>小文字 → 大文字</li>
 * <li>大文字 → 小文字</li>
 * <li>入力属性制限</li>
 * <li>入力項目ガイド</li><BR>
 * 未実装：IME制御
 * </p>
 *
 * */
public class TextField extends JTextField implements ICompornent {

	private static final long serialVersionUID = 1L;

	/** 必須かどうか */
	private Required required;

	/** コンストラクタ */
	private TextField() {
		super();
		setFont(DEFAULT_FONT);
	}

	/**
	 * コンストラクタ
	 * <p>
	 * パラメータが多い点はインスタンス取得のメソッドを増やすことで対応したい。
	 * </p>
	 * @param name 入力項目ガイド名
	 * @param inputCharType 入力文字種
	 * @param upperStringType 大文字/小文字
	 * @param maxLength 最大入力文字数
	 * @param iMEType IMEモード
	 * @param required 必須
	 * */
	private TextField(String name, InputCharType inputCharType, UpperStringType upperStringType, int maxLength, IMEType iMEType, Required required) {
		super();

		setFont(DEFAULT_FONT);

		setName(name);
		setInputType(inputCharType);
		setUpperStringType(upperStringType);
		setMaxLength(maxLength);
		addFocusListener(new FieldListener(iMEType, this));
		this.required = required;
		setRequiredColor();
	}

	/** コンストラクタの生成タイミングで呼ばれる。 */
	@Override
	protected Document createDefaultModel() {
		return new IkdDocument();
	}

	/** インスタンス取得 */
	public static TextField getCzTextField() {
		return new TextField();
	}

	/**
	 * インスタンス取得
	 * @param name 入力項目ガイド名
	 * @param inputCharType 入力文字種
	 * @param upperStringType 大文字/小文字
	 * @param maxLength 最大入力文字数
	 * @param iMEType IMEモード
	 * @param required 必須
	 * */
	public static TextField getCzTextField(String name, InputCharType inputCharType, UpperStringType upperStringType, int maxLength, IMEType iMEType, Required required) {
		return new TextField(name, inputCharType, upperStringType, maxLength, iMEType, required);
	}

	/** 文字種設定 */
	public void setInputType(InputCharType inputCharType) {
		((IkdDocument) getDocument()).setInputType(inputCharType);
	}

	/** 大文字・小文字変換設定 */
	public void setUpperStringType(UpperStringType upperStringType) {
		((IkdDocument) getDocument()).setUpperStringType(upperStringType);
	}

	/** 最大入力文字数設定 */
	public void setMaxLength(int maxLength) {
		((IkdDocument) getDocument()).setMaxLength(maxLength);
	}

	/**
	 * 必須かどうかを取得します。
	 * @return 必須かどうか
	 */
	public Required getRequired() {
		return required;
	}

	/**
	 * 必須かどうかを設定します。
	 * @param required 必須かどうか
	 */
	public void setRequired(Required required) {
		this.required = required;
		setRequiredColor();
	}

	/** 必須項目の色設定 */
	private void setRequiredColor() {

		if (this.required == null) {
			return;
		}

		switch (this.required) {
		case BE_REQUIRED:
			setBackground(this.required.getRequiredColor());
			break;
		default:
			break;
		}
	}
}